package com.boil.qz.safekavass.service;

import com.alibaba.fastjson.JSONObject;
import com.boil.qz.safekavass.model.WeixinAccessToken;
import com.boil.qz.safekavass.repository.WeixinAccessTokenRepository;
import com.boil.qz.safekavass.weixin.util.WeixinUtils;
import com.boil.util.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * Created by ChenYong on 2017-05-22.
 * <br>
 * 微信凭证 Service。
 */
@Service
public class WeixinAccessTokenService extends JpaRepositoryService<WeixinAccessToken, Long> {
    /**
     * 注入微信凭证实体仓库
     */
    @Autowired
    private WeixinAccessTokenRepository weixinAccessTokenRepository;

    /**
     * 处理微信凭证的业务
     */
    public void doAccessToken() {
        try {
            JSONObject accessTokenJSONObject = WeixinUtils.sendHttpsGet(String.format(WeixinUtils.URL_GET_ACCESS_TOKEN, WeixinUtils.APP_ID, WeixinUtils.APP_SECRET));

            // 获取成功
            if (StringUtils.isBlank(accessTokenJSONObject.getString(WeixinUtils.ERRCODE_STR))) {
                WeixinAccessToken accessToken = new WeixinAccessToken();
                accessToken.setAccessToken(accessTokenJSONObject.getString(WeixinUtils.ACCESS_TOKEN_STR));
                accessToken.setExpiresIn(accessTokenJSONObject.getIntValue(WeixinUtils.EXPIRES_IN_STR));
                accessToken.setExpiresCode(Constants.VALUE_0);
                accessToken.setStartTime(new Date());
                accessToken.setEndTime(new Date(accessToken.getStartTime().getTime() + (accessToken.getExpiresIn() * Constants.VALUE_1000)));

                // 缓存
                WeixinUtils.ACCESS_TOKEN = accessToken.getAccessToken();

                // 更新数据库中的 access_token 到期
                weixinAccessTokenRepository.updateExpires();
                // 保存新的 access_token 到数据库
                save(accessToken);

                log.info("微信凭证作业（WeixinAccessTokenTask）--->获取微信服务器上的access_token：{}", accessToken.getAccessToken());
            }
        } catch (Exception e) {
            log.error("微信凭证作业（WeixinAccessTokenTask）--->获取微信服务器上的access_token出现异常：{}", e);
        }
    }
}